#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

// int socket(int domain, int type, int protocol);

#define MYPORT 4000

int main(int argc, char const *argv[])
{
    int sockfd;
    int bindcheck; // 判断bind函数是否能成功运行

    struct sockaddr_in my_addr;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // 进行错误检查
    if(sockfd == -1) {
        perror("socket failed");
        exit(1);
    } else {
        my_addr.sin_family = AF_INET;       // 主机字节顺序
        my_addr.sin_port = htons(MYPORT);   // 网络字节顺序
        my_addr.sin_addr.s_addr = inet_addr("192.168.81.136");  // 网络字节顺序
        bzero(&(my_addr.sin_zero), 8); // 剩余部分数据设置为0

        bindcheck = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

        // 直接将my_addr转换为struct sockaddr类型
        // 如何做到的？
        // 二者长度一样，都是16个字节，即占用的内存大小是一致的，因此可以互相转化。二者是并列结构，指向sockaddr_in结构的指针也可以指向sockaddr。

        if (bindcheck == -1)
        {
            perror("bind failed");
            exit(1);
        } else {
            printf("bind success");
        }
        
    }
    return 0;
}
